查看原文
其他

Pandas中节约空间的小tip—categorical类型

爬虫俱乐部 Stata and Python数据分析 2022-03-15

本文作者:孙晓玲

文字编辑:钱梦璇

技术总编:张   邯

导读



categorical是Pandas中的分类类型数据,当数据只有少数几种可能取值但有大量重复字符串字段,利用categorical类型可有效节省内存,提高数据分析的效率。常见的分类如性别、职业等取值有限的类别数据。


一、categorical的创建

Pandas中创建categorical型数据的方法很多,主要有以下三种途径。

1. 由Series数据结构转换。在生成Series时传入参数dtype=“category”,直接创建categorical型Series。

import numpy as npimport pandas as pdindex = pd.Index(data=['Tom','Mary','Andy','Bob','Alice','James','Lily','Mike'], name="name")series_cat=pd.Series(['teacher','student','clerk','student']*2, index=index,name='career',dtype='category')series_cat

这样,就生成了一个名为“career”具有三种职业类型的categorical型Series。

2. 由DataFrame数据转换。先生成DataFrame数组,再用df.astype修改指定列的数据类型为“category”。

career = ['teacher','student','clerk','student']*2sex=['man','female','female','man','female','man','female','man']lens = len(career)df = pd.DataFrame({'career': career, 'sex': sex, 'id': np.arange(lens), 'temperature': np.random.uniform(36, 38, size=lens)}, index=index, columns=['id','career', 'sex', 'temperature'])df

查看生成DataFrame数组发现,数组中“career”和“sex”为分类数据,再对“career”和“sex”列进行转换。

df_cat=dfdf_cat['career']=df_cat['career'].astype('category')df_cat['sex']=df_cat['sex'].astype('category')print(df_cat['career'])print(df_cat['sex'])

“career”列和“sex”列数据类型为分类数据。

3. 由pd.Categorical()直接生成categorical型数据再转换为Series,或替换DataFrame中的指定内容。使用这种方法生成数据时,可用参数指定分类的类型及顺序。

categories = ['student', 'teacher', 'clerk']codes = [1,0,2,0]*2cat = pd.Categorical.from_codes(codes=codes, categories=categories)cat

其中,codes和categories分别为categorical型数据的编码属性和分类属性。

ordered_cat = pd.Categorical.from_codes(codes, categories, ordered=True)ordered_cat

想要获得指定排序的分类,向ordered参数传递布尔值“True”,默认为“False”。这里的职业分类并无强度关系,不需要传递。

series_cat=pd.Series(index=index,data=cat)series_cat


二、categorical的优良特性

1.用分类节省内存

在文章的开头就提到当数据只有少数几种可能取值但有大量重复字符串字段时,字符串占据的内存就比较大,利用categorical类型对其转换后可有效节省内存。

N = 1000000draws = pd.Series(np.random.randn(N))series = pd.Series(['type1', 'type2', 'type3', 'type4'] * (N // 4))categories = series.astype('category')series.memory_usage()categories.memory_usage()

明显看到分类数据占的内存比Series数据占据内存更小。当然,这个过程也付出了一定的代价,代价就是数据转换的时间。

%time _ = series.astype('category')


2.自定义排序

生成一个数据集,将其按评估结果排序:

df = pd.DataFrame({ 'assessment':np.random.choice(['Bad','Very Bad','Good','Very Good'],10), 'score':np.random.uniform(0,10,10)})df.sort_values('assessment')

输出结果直接按首字母排序,并未按评估结果好坏排序。欲得到预期的排序结果,将制定的排序结果传递给数据集。

from pandas.api.types import CategoricalDtypemy_cat = CategoricalDtype(categories=['Very Good','Good','Bad','Very Bad'], ordered=True)df['assessment'] = df['assessment'].astype(my_cat)df.sort_values('assessment')

今天就介绍到这里,categorical的更多好用之处还在等待你的发掘!







对我们的推文累计打赏超过1000元,我们即可给您开具发票,发票类别为“咨询费”。用心做事,不负您的支持!
往期推文推荐

Ftools命令组之flevelsof命令介绍

疫情下的家庭关系|《请回答1988》影评爬取
教你把Python当美图秀秀用(二)
自己动手进行线性回归计算
personage与年龄
原来这才是查看盲评结果的正确方式
教你把Python当美图秀秀用(一)
用数据透视表剖析泰坦尼克号乘客数据
读入文本文档,intext来帮忙
matchit——解锁文本相似度的钥匙
基于广义线性模型的机器学习算法——线性回归
听说你会魔法?
dummieslab——从分类变量到虚拟变量的“一步之遥”
线上Python课程都面向哪些方向?
子类与父类
用requests库爬取淘宝数据
WordStat—Stata的文本分析小助手
数据筛选理还乱,datacheck能诊断
关于我们


微信公众号“Stata and Python数据分析”分享实用的stata、python等软件的数据处理知识,欢迎转载、打赏。我们是由李春涛教授领导下的研究生及本科生组成的大数据处理和分析团队。

此外,欢迎大家踊跃投稿,介绍一些关于stata和python的数据处理和分析技巧。
投稿邮箱:statatraining@163.com
投稿要求:
1)必须原创,禁止抄袭;
2)必须准确,详细,有例子,有截图;
注意事项:
1)所有投稿都会经过本公众号运营团队成员的审核,审核通过才可录用,一经录用,会在该推文里为作者署名,并有赏金分成。
2)邮件请注明投稿,邮件名称为“投稿+推文名称”。
3)应广大读者要求,现开通有偿问答服务,如果大家遇到有关数据处理、分析等问题,可以在公众号中提出,只需支付少量赏金,我们会在后期的推文里给予解答。

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存